/**
深入研究接口（interfaces）这一特性，理解类型和接口之间的关系。熟练使用声明、实现以及接口类型之间的转换和空接口类型的特点。
用学到的知识实现下面的题目：
第一季中我们用接口实现了排序功能，今天的任务难度稍有提高！
使用接口实现便于扩展输出方式的日志系统。要求将命令行中输入的命令，通过日志系统存入文件中，并输出到界面上。
保证代码结构严谨，无报错，不崩溃。
 */
package main

import (
	"time"
	"fmt"
	"os"
)

type logger interface {
	w(string)
}

type fileLogger struct {
	file *os.File
	date string
	time string
}

func main() {
	for {
		var info string
		var logger fileLogger
		fmt.Println("请输入要记录的内容：")
		fmt.Scan(&info)
		logger.w(info)
	}

}

func (l *fileLogger) w(info string) {
	l.getFile()
	var content = l.time + " info:" + info + "\r\n"
	l.file.WriteString(content)
	fmt.Print("terminal -> "+content+"\n")
}

func (l *fileLogger) getFile() {
	l.setDateTime()
	var file = l.date + ".log"
	fileHandler, error := os.OpenFile(file, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0766)
	if error != nil {
		fmt.Println(error)
		os.Exit(0)
	}

	l.file = fileHandler
}

func (l *fileLogger) setDateTime() {
	//设置当前时间和日期
	var currentTime = time.Now().String()
	l.time = currentTime[:19]
	l.date = currentTime[:10]
}
